package com.hspedu.final_;

/**
 * final使用注意事项：
 * 1.final修饰的属性又叫 常量 ，一般用 XX_XX_XX 来命名
 * 2.final修饰的属性在定义时，必须赋初值，并且以后不能再修改，赋值可以加载以下位置之一：
 *      a.定义时：如public final double TAX_RATE = 0.08;
 *      b.在构造器中
 *      c.在代码块中
 * 3.如果final修饰的属性是静态的，则初始化的位置只能是
 *   a.定义时 b.在静态代码块，不能在构造器中赋值
 * 4.final类不能继承，但是可以实例化对象
 * 5.如果类不是final类，但是含有final方法，则该方法虽然不能重写，但是可以被继承
 * 6.如果一个类已经是final类了，就没必要再将方法用final修饰
 * 7.final不能修饰构造方法
 * 8.final和static往往搭配使用，效率更高，底层编译器做了优化处理
 * 9.包装类(Integer, Double, Float, Boolean等)都是final，String也是final类
 */
public class FinalDetail01 {
    public static void main(String[] args) {
        CC cc = new CC();//final修饰的类可以实例化但是不能够继承

        new EE().cal();//可以使用父类中被final修饰的方法
    }
}

class AA{
    //1.final可以在属性定义的时候使用
    public final double TAX_RATE = 0.08;
    public final double TAX_RATE2;
    public final double TAX_RATE3;
    //public final double TAX_RATE4;//在属性中定义的话必须赋初值，不然要报错
    public AA(){
        TAX_RATE2 = 1.1;//2.定义的时候没有赋初值，可以在构造器中赋值
    }
    {
        TAX_RATE3 = 1.1;//3.可以在代码块中赋值
    }
}

class BB{
    /**
     * 如果final修饰的属性是static静态的，则初始化的位置只能是
     *    a.定义时 b.在静态代码块，不能子构造器中赋值
     */
    public static final double TAX_RATE = 0.01;

    /*在代码块中赋初值不行
    public static final double TAX_RATE2;
    {
        TAX_RATE2 = 0.01;
    }
     */

    /*在构造器中赋初值不行，因为构造器是最后加载的
    public static final double TAX_RATE3;
    public BB(){
        TAX_RATE3=0.11;
    }

     */

    //可以在静态代码块中赋初值
    public static final double TAX_RATE4;
    static {
        TAX_RATE4 = 0.01;
    }
}


final class CC{

}


//如果类不是final类，但是含有final方法，则该方法虽然不能重写，但是可以被继承
class DD{
    public final void cal(){
        System.out.println("cal()方法");
    }
}

class EE extends DD{

}